package com.yuan.java.thread.threadNotSafe;

import org.junit.Test;

public class ThreadTest0 {

    /**
     * 未同步方法  多个线程可能同时进入
     * 同时打出 进入线程
     * 不能保证num 是否被同时访问
     */
    @Test
    public void main0() {
        Runnable runnable = new Runnable() {
            Count0 count = new Count0();

            public void run() {
                count.count();
            }
        };
        for (int i = 0; i < 10; i++) {
            new Thread(runnable).start();
        }
    }


    /**
     * 方法一 改造 在进行run的时候加锁 得到的效果同1
     */
    @Test
    public void main0Plus() {
        Runnable runnable = new Runnable() {
            Count0 count = new Count0();

            public synchronized void run() {
                count.count();
            }
        };
        for (int i = 0; i < 10; i++) {
            new Thread(runnable).start();
        }
    }

    /**
     * 可以看到所有的打印都是顺序执行
     * 保证方法同时进入
     * 不能保证num 是否被同时访问
     */
    @Test
    public void main1() {
        Runnable runnable = new Runnable() {
            Count1 count = new Count1();

            public void run() {
                count.count();
            }
        };
        for (int i = 0; i < 10; i++) {
            new Thread(runnable).start();
        }
    }


    /**
     * 把num 设置成 局部变量保证值的准确性
     * 但是打印是无序的
     */
    @Test
    public void main2() {
        Runnable runnable = new Runnable() {
            Count2 count = new Count2();

            public void run() {
                count.count();
            }
        };
        for (int i = 0; i < 10; i++) {
            new Thread(runnable).start();
        }
    }
}  